#ifndef __LIB_AGORA_CORE_HEADER_H__
#define __LIB_AGORA_CORE_HEADER_H__

namespace AgoraCore
{

/**
 * \enum Encodage
 * \brief Constantes d'encodage.
 *
 */
enum Encodage
{
	NONE = 0, /*!< Aucun encodage*/
	SPEEX = 1 /*!< Encodage Speex*/
};

/**
 * \enum ALFormat
 * \brief Constantes de format OpenAL.
 * 
 */
enum ALFormat
{
	MONO8 = 1, /*!< format audio mono 8 bits*/
	MONO16 = 2, /*!< format audio mono 16 bits*/
	STEREO8 = 3, /*!< format audio stereo 8 bits*/
	STEREO16 = 4 /*!< format audio stereo 16 bits*/
};

/**
 * \enum FrequenceEnum
 * \brief Constantes de frequence d'echantillonage.
 * 
 */
enum FrequenceEnum
{
	NARROWBAND = 8000, /*!< frequence d'echantillonage basse*/
	WIDEBAND = 16000, /*!< frequence d'echantillonage moyenne*/
	ULTRAWIDEBAND = 32000 /*!< frequence d'echantillonage haute*/
};


/**
 * \enum TYPE
 * \brief Type du packet Agora.
 *
 * 
 */
enum TYPE
{
	AUDIO, /*!< donnees de type audio*/
	ADMIN, /*!< donnees de type administration*/
	TEXT /*!< donnees de type texte*/
};

/**
 * \struct InfoBase
 * \brief Structure decrivant la base de l'entete d'un paquet Agora.
 * 
 */
struct InfoBase
{
	int  id;/*!< identificateur client*/
	int	 sourceId;/*!< identificateur de la source Audio*/
	/*TODO enum TYPE */char type; /*!< type du paquet Agora*/
	short sizeTotalWithoutInfoBase; /*!< taille du paquet (la taille de cette structure n'est pas comptabilisee)*/
	short sizeData; /*!< taille des donnees suivant l'entete du paquet*/
};



/**
 * \struct InfoAudioBase
 * \brief Structure decrivant l'entete d'un paquet Agora pour la partie audio
 * 
 */
struct InfoAudioBase
{
	unsigned short	frequence; /*!< frequence utilisee lors de la capture du son*/
	char			format; /*!< format des donnees*/
	char			encodage; /*!< type d'encodage*/
	bool			spacial; /*!< informations spaciale disponible? oui si vrai, non si faux*/
};

/**
 * \struct InfoAudioSpacial
 * \brief Structure decrivant l'entete d'un paquet Agora pour la spacialisation du son
 * 
 */
struct InfoAudioSpacial
{
	int x; /*!< position x de la source audio*/
	int y; /*!< position y de la source audio*/
	int z; /*!< position z de la source audio*/
	int vx; /*!< velocite x de la source audio*/
	int vy; /*!< velocite y de la source audio*/
	int vz; /*!< velocite z de la source audio*/
	int dirx; /*!< direction z de la source audio*/
	int diry; /*!< direction z de la source audio*/
	int dirz; /*!< direction z de la source audio*/

};

/**
 * \struct InfoEncodage
 * \brief Structure decrivant l'entete d'un paquet Agora pour les information liees a l'encodage
 * 
 */
struct InfoEncodage
{
	char quality; /*!< qualite d'encodage*/
	short nbFramePerPacket; /*!< nombre de frame par paquet Agora*/
};

enum AdminFunction
{
	TREATERROR,
	GETALLCHANNEL,
	CREATECHANNEL,
	JOINCHANNEL,
	GETALLUSER,
	GETHOSTRIGHT,
	GETCHANNELRIGHT,
	GETUSERHOSTRIGHT,
	GETUSERCHANNELRIGHT,
	DELETECHANNEL,
	DISCONNECT,
	CONNECT,
	CREATEUSER,
	DELETEUSER,
	KICKUSER,
	BANUSER,
	GETBANUSERLIST,
	UNBANUSER,
	EDITUSERCHANNELRIGHT,
	EDITUSERHOSTRIGHT,
	CHANGEUSERLOGIN,
	CHANGEUSERPASSWORD,
	EDITCHANNEL,
	KICKUSERSERVER,
	SENDMESSAGE,
	BANUSERSERVER,
	UNBANUSERSERVER,
	GETBANUSERLISTSERVER/*,
	MUTEUSER,
	GETMUTEUSERLIST,
	UNMUTEUSER*/
};

enum InterpreterErrorCode
{
	ERRORNORIGHTCREATECHANNEL = 100,
	ERRORNORIGHTCHANGECHANNEL = 101,
	ERRORCHANNELEXISTS = 102,
	ERRORCHANNELPASSWORD = 103,
	ERRORNOCHANNEL = 104,
	ERRORUSEREXISTS = 105,
	ERRORNORIGHTEDITUSER = 106,
	ERRORNORIGHTKICKUSER = 107,
	ERRORNOUSER = 108,
	ERRORMOVEUSER = 109,
	ERRORNORIGHTCHANGELOGIN = 110,
	ERRORNORIGHTCHANGEPASSWORD = 111,
	ERRORNORIGHTEDITCHANNEL = 112,
	ERRORNORIGHTBANUSER = 113,
	ERRORNORIGHTDELETECHANNEL = 114,
	ERRORUSERCHANNELBAN = 115,
	ERRORMSGTYPE = 116,
	ERRORNORIGHTWRITECHANNEL = 117/*,
	ERRORNORIGHTMUTEUSER = 116*/
};

/**
 * \struct InfoAdmin
 * \brief Structure decrivant l'entete d'un paquet Agora cote adminisatration
 * 
 */
struct InfoAdmin
{
	AdminFunction	function;
//	int TODO; /*!< En developpement*/
};

enum MsgTextType
{
	MSGALLCHANNEL,
	MSGCHANNEL,
	MSGUSER
};
/**
 * \struct Header
 * \brief Structure decrivant l'entete generale d'un paquet Agora
 * 
 */
struct Header
{
	InfoBase			*base; /*!< pointeur sur une structure InfoBase*/
	InfoAudioBase		*audio; /*!< pointeur sur une structure InfoAudioBase*/
	InfoAudioSpacial	*spacial; /*!< pointeur sur une structure InfoAudioSpacial*/
	InfoAdmin			*admin; /*!< pointeur sur une structure InfoAdmin*/
};


}

#endif
